lexer grammar BasicLexer;

DIM             : 'Dim';
AS              : 'As';

ADD             : '+';
MINUS           : '-';
MULTIPLY        : '*';
DIVIDE          : '/';
MOD             : '%';
LPARENTHESES    :  '(';
RPARENTHESES    :  ')';

BITAND          : 'BitAnd';
BITOR           : 'BitOr';
AND             : 'And';
OR              : 'Or';
XOR             : '^';
NOT             : 'Not';

CONCATENATE     : '&';

EQ              : '==';
NEQ             : '<>';
GT              : '>';
LT              : '<';
GTE             : '>=';
LTE             : '<=';
ASSIGN          : '=';

COMMENT         : '\'';

IF              : 'If';
ELSEIF          : 'ElseIf';
ELSE            : 'Else';
ENDIF           : 'End If';
THEN            : 'Then';

FOR             : 'For';
TO              : 'To';
DOWNTO          : 'DownTo';
NEXT            : 'Next';
STEP            : 'Step';

WHILE           : 'While';
ENDWHILE        : 'End While';

DO              : 'Do';
LOOP            : 'Loop';

BREAK           : 'Break';
CONTINUE        : 'Continue';

SUB             : 'Sub';
ENDSUB          : 'End Sub';
FUNCTION        : 'Function';
ENDFUNCTION     : 'End Function';
RETURN          : 'Return';
EXITSUB         : 'Exit Sub';

TRUE            : 'True';
FALSE           : 'False';

/* 面向对象编程 */
NEW             : 'New';
DOT             : '.';
CLASS           : 'Class';
INHERITS        : 'Inherits';
IMPLEMENTS      : 'Implements';
INTERFACE       : 'Interface';
SHARED          : 'Shared';
ENDCLASS        : 'End Class';
ENDINTERFACE    : 'End Interface';
PUBLIC          : 'Public';
PROTECTED       : 'Protected';
PRIVATE         : 'Private';
ME              : 'Me';

FOREACH         : 'ForEach';
OF              : 'OF';
ENDFOREACH      : 'End ForEach';

ARRAY_SYMBOL    : '[]';

STRING          : '"' .*? '"';

ID              : [_A-Za-z][_A-Za-z\-0-9]*;
INT             : [0-9]+;
DECIMAL         : [0-9]+ '.' [0-9]+;

NEWLINE         : [\r\n]+;

MAP_ASSIGN      : ':=';

WS              : [ \t]+ -> skip;